﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using QuanLyTruongHoc_App.MyDataSet;
using QuanLyTruongHoc_App.MyDataSet.QLTHTableAdapters;
using System.Data.OleDb;

namespace QuanLyTruongHoc_App
{
    public static class PublicLib
    {
        public static String STR_CONN = "";

        public static Boolean setConnectStr()
        {
            if (!System.IO.File.Exists(SysConfig.getConfigFilePath()))
                return false;
            System.IO.StreamReader r = System.IO.File.OpenText(SysConfig.getConfigFilePath());
            try
            {
                //STR_CONN = "Provider = " + CryptorEngine.Decrypt(r.ReadLine(), true) + ";";
                r.ReadLine(); // provider
                STR_CONN += "Data Source=" + CryptorEngine.Decrypt(r.ReadLine(), true) + ";";
                STR_CONN += "Initial Catalog=" + CryptorEngine.Decrypt(r.ReadLine(), true) + ";";
                STR_CONN += "User ID=" + CryptorEngine.Decrypt(r.ReadLine(), true) + ";";
                STR_CONN += "PassWord=" + CryptorEngine.Decrypt(r.ReadLine(), true);
                r.Close();
            }
            catch 
            {
                r.Close();
                return false;
            }
            return true;
        }

        public static Boolean checkConn()
        {
            try
            {
                System.Data.OleDb.OleDbConnection objConn 
                    = new System.Data.OleDb.OleDbConnection(getFullStrConn());
                objConn.Open();
                objConn.Close();
                return true;
            }
            catch (OleDbException)
            {
                return false;
            }
        }

        public static String getStrConn()
        {
            return STR_CONN;
        }

        public static String getFullStrConn()
        {
            return "Provider=SQLOLEDB;" + getStrConn();
        }


        public static Boolean checkLogin(String _user, String _pass)
        {
            QLTH.tbl_UserDataTable tbl = new QLTH.tbl_UserDataTable();
            tbl_UserTableAdapter adap = new tbl_UserTableAdapter();
            adap.Connection.ConnectionString = PublicLib.getStrConn();
            adap.FillByUserPass(tbl, _user, CryptorEngine.GetMD5Hash(_pass));
            
            return tbl.Rows.Count > 0;
        }

        public static String formatGVId(int id)
        {
            String result = "GV-" + id.ToString("00000");

            return result;
        }

        public static String formatHSId(int id)
        {
            String result = "HS-" + id.ToString("000000");

            return result;
        }

        public static int getMaxIdFromTbl(String _tblName, String _idCol)
        {
            String strSQL = "SELECT MAX([" + _idCol + "]) FROM [" + _tblName + "]";
            OleDbConnection conn = new OleDbConnection(getFullStrConn());
            conn.Open();
            OleDbCommand objCmd = new OleDbCommand(strSQL, conn);
            OleDbDataReader reader = objCmd.ExecuteReader();
            reader.Read();
            String str = reader.GetValue(0).ToString();
            conn.Close();
            if (str.ToUpper() == "")
                return 0;
            else
                return int.Parse(str);
        }

        public static Boolean updateField(String _tblName, String _keyCol, String _keyVal,
                                    String _col, String _newVal)
        {
            OleDbConnection conn = new OleDbConnection(getFullStrConn());
            conn.Open();
            try
            {
                String strSQL = "UPDATE [" + _tblName + "] SET [" + _col + "]=" + _newVal +
                                " WHERE [" + _keyCol + "]=" + _keyVal;
                OleDbCommand objCmd = new OleDbCommand(strSQL, conn);
                objCmd.ExecuteNonQuery();
                conn.Close();
                return true;
            }
            catch 
            {
                conn.Close();
                return false;
            }
        }
        #region OPtion value
        public static String getOptionValue(String _key)
        {
            MyDataSet.QLTH.tbl_TuyChonDataTable tbl = new QLTH.tbl_TuyChonDataTable();
            MyDataSet.QLTHTableAdapters.tbl_TuyChonTableAdapter adap = new tbl_TuyChonTableAdapter();
            adap.Connection.ConnectionString = getStrConn();

            adap.Fill(tbl);
            DataRow []tmp = tbl.Select(tbl.idColumn.ColumnName + "='" + _key + "'");
            if (tmp.Length > 0)
                return tmp[0][tbl.valueColumn].ToString();

            return "";
        }

        public static void setOptionValue(String _key, String _value)
        {
            MyDataSet.QLTH.tbl_TuyChonDataTable tbl = new QLTH.tbl_TuyChonDataTable();
            MyDataSet.QLTHTableAdapters.tbl_TuyChonTableAdapter adap = new tbl_TuyChonTableAdapter();
            adap.Connection.ConnectionString = getStrConn();

            adap.Fill(tbl);
            DataRow[] tmp = tbl.Select(tbl.idColumn.ColumnName + "='" + _key + "'");
            if (tmp.Length > 0)
            {
                tmp[0][tbl.valueColumn] = _value;
                adap.Update(tmp[0]);
            }
            else
            {
                DataRow row = tbl.NewRow();
                row[tbl.idColumn] = _key;
                row[tbl.valueColumn] = _value;
                tbl.Rows.Add(row);
                adap.Update(row);
            }
        }
        #endregion
        /****************************************************
         * Check String co Dang 8, 7, 8, 0
         ****************************************************/ 
        public static Boolean checkStr(String _val)
        {
            String[] tmp = _val.Split(',');
            float t;
            for (int i = 0; i < tmp.Length; i++)
            {
                String tt = tmp[i].Trim();
                if (tt.Length > 0) 
                    if (!float.TryParse(tmp[i].Trim(), out t))
                        return false;
            }
            return true;
        }
        /****************************************************
         * get list diem dang 8, 7, 8, 0
         ****************************************************/ 
        public static List<float> getListDiem(String _val)
        {
            String[] tmp = _val.Split(',');
            List<float> result = new List<float>();
            for (int i = 0; i < tmp.Length; i++)
            {
                String tt = tmp[i].Trim();
                if (tt.Length > 0)
                    result.Add(float.Parse(tmp[i].Trim()));
            }
            return result;
        }

        public static int getNamHocHienTai()
        {
            MyDataSet.QLTH.tbl_NamHocDataTable data = new QLTH.tbl_NamHocDataTable();
            return getMaxIdFromTbl(data.TableName, data.idColumn.ColumnName);
        }

/************************************************************************************* 
Điều 13. Tiêu chuẩn xếp loại học kỳ và xếp loại cả năm
1. Loại giỏi, nếu có đủ các tiêu chuẩn dưới đây:
    a) Điểm trung bình các môn học từ 8,0 trở lên, trong đó: đối với học sinh THPT chuyên thì điểm môn chuyên từ 8,0 trở lên; 
       đối với học sinh THCS và THPT không chuyên thì có 1 trong 2 môn Toán, Ngữ văn từ 8,0 trở lên;
    b) Không có môn học nào điểm trung bình dưới 6,5.
2. Loại khá, nếu có đủ các tiêu chuẩn dưới đây:
    a) Điểm trung bình các môn học từ 6,5 trở lên, trong đó: đối với học sinh THPT chuyên thì điểm môn chuyên từ 6,5 trở lên; 
       đối với học sinh THCS và THPT không chuyên thì có 1 trong 2 môn Toán, Ngữ văn từ 6,5 trở lên;
    b) Không có môn học nào điểm trung bình dưới 5,0.
3. Loại trung bình, nếu có đủ các tiêu chuẩn dưới đây:
    a) Điểm trung bình các môn học từ 5,0 trở lên, trong đó: đối với học sinh THPT chuyên thì điểm môn chuyên từ 5,0 trở lên; 
       đối với học sinh THCS và THPT không chuyên thì có 1 trong 2 môn Toán, Ngữ văn từ 5,0 trở lên;
    b) Không có môn học nào điểm trung bình dưới 3,5.
4. Loại yếu: điểm trung bình các môn học từ 3,5 trở lên và không có môn học nào điểm trung bình dưới 2,0.
5. Loại kém: các trường hợp còn lại.
6. Nếu ĐTBhk hoặc ĐTBcn đạt mức quy định cho từng loại nói tại các khoản 1, 2, 3, 4, 5 Điều này, 
   nhưng do ĐTB của 1 môn học thấp hơn mức quy định cho loại đó nên học lực bị xếp thấp xuống thì được điều chỉnh như sau:
a) Nếu ĐTBhk hoặc ĐTBcn đạt mức loại G 
     - nhưng do ĐTB của 1 môn học phải xuống loại Tb thì được điều chỉnh xếp loại K;
b) Nếu ĐTBhk hoặc ĐTBcn đạt mức loại G 
     - nhưng do ĐTB của 1 môn học phải xuống loại Y hoặc kém thì được điều chỉnh xếp loại Tb;
c) Nếu ĐTBhk hoặc ĐTBcn đạt mức loại K 
     - nhưng do ĐTB của 1 môn học phải xuống loại Y thì được điều chỉnh xếp loại Tb;
d) Nếu ĐTBhk hoặc ĐTBcn đạt mức loại K 
     - nhưng do ĐTB của 1 môn học phải xuống loại kém thì được điều chỉnh xếp loại Y.
(Các) nguồn
QUYẾT ĐỊNH Số: 40/2006/QĐ-BGDĐT
Ban hành Quy chế đánh giá, xếp loại học sinh trung học cơ sở và học sinh trung học phổ thông 
***************************************************************************************/

        public static int XetHocLuc_LopThuong(float _diemToan, float _diemVan, float _diemMin, float _diemTB)
        {
            if (_diemTB >= 8)
            {
                if (_diemToan >= 8 || _diemVan >= 8)
                {
                    if (_diemMin >= 6.5) return PConst.HL_GIOI;
                    if (_diemMin >= 3.5) return PConst.HL_KHA;
                    else return PConst.HL_TRUNG_BINH;
                }
            }

            if (_diemTB >= 6.5)
            {
                if (_diemToan >= 6.5 || _diemVan >= 6.5)
                {
                    if (_diemMin >= 5.0) return PConst.HL_KHA;
                    if (_diemMin >= 2.0) return PConst.HL_TRUNG_BINH;
                    else return PConst.HL_YEU;
                }
            }

            if (_diemTB >= 5.0)
            {
                if (_diemToan >= 5.0 || _diemVan >= 5.0)
                {
                    if (_diemMin >= 3.5) return PConst.HL_TRUNG_BINH;
                    if (_diemMin >= 2.0) return PConst.HL_YEU;
                    else return PConst.HL_KEM;
                }
            }

            if (_diemTB >= 3.5)
            {
                if (_diemToan >= 3.5 || _diemVan >= 3.5)
                {
                    if (_diemMin >= 2.0) return PConst.HL_YEU;
                }
            }
            return PConst.HL_KEM;
        }

        public static int XetHocLuc_LopChuyen(float _diemMonChuyen, float _diemMin, float _diemTB)
        {
            if (_diemTB >= 8)
            {
                if (_diemMonChuyen >= 8)
                {
                    if (_diemMin >= 6.5) return PConst.HL_GIOI;
                    if (_diemMin >= 3.5) return PConst.HL_KHA;
                    else return PConst.HL_TRUNG_BINH;
                }
            }

            if (_diemTB >= 6.5)
            {
                if (_diemMonChuyen >= 6.5)
                {
                    if (_diemMin >= 5.0) return PConst.HL_KHA;
                    if (_diemMin >= 2.0) return PConst.HL_TRUNG_BINH;
                    else return PConst.HL_YEU;
                }
            }

            if (_diemTB >= 5.0)
            {
                if (_diemMonChuyen >= 5.0)
                {
                    if (_diemMin >= 3.5) return PConst.HL_TRUNG_BINH;
                    if (_diemMin >= 2.0) return PConst.HL_YEU;
                    else return PConst.HL_KEM;
                }
            }

            if (_diemTB >= 3.5)
            {
                if (_diemMonChuyen >= 3.5)
                {
                    if (_diemMin >= 2.0) return PConst.HL_YEU;
                }
            }
            return PConst.HL_KEM;
        }

        public static int XetTotNghiep(float _diemMin, int _under5, float _diemTB)
        {
            if (_diemMin >= 4.5 && _under5 <= 1)
            {
                if (_diemTB >= 9) return PConst.TN_XUAT_SAC;
                if (_diemTB >= 8) return PConst.TN_GIOI;
                if (_diemTB >= 6.5) return PConst.TN_KHA;
                if (_diemTB >= 5) return PConst.TN_TRUNG_BINH;
            }
            return PConst.TN_KHONG_DU_DK;
        }

        #region load user power
        public static String CURR_USER = "";

        private static MyDataSet.QLTH.tbl_QuyenDataTable powTable;

        public static void loadUserPower(String _username)
        {
            powTable = new QLTH.tbl_QuyenDataTable();

            tbl_UserTableAdapter userAdap = new tbl_UserTableAdapter();
            MyDataSet.QLTH.tbl_UserDataTable usertbl = new QLTH.tbl_UserDataTable();
            userAdap.Connection.ConnectionString = getStrConn();
            userAdap.FillByUserName(usertbl, _username);
            if (usertbl.Rows.Count == 0) return;

            int userId = (int)usertbl[0][usertbl.idColumn];

            tbl_QuyenTableAdapter quyenAdap = new tbl_QuyenTableAdapter();
            quyenAdap.Connection.ConnectionString = getStrConn();

            quyenAdap.FillByNguoiDung(powTable, userId);
        }

        public static int getUserPower(int _powerId)
        {
            int result = 0;

            DataRow[] tmp = powTable.Select(powTable.idQuyenColumn.ColumnName + "=" + _powerId);
            if (tmp.Length > 0)
                result = (int)tmp[0][powTable.QuyenColumn];

            return result;
        }

        #endregion

        public static void getThongTinTable(MyDataSet.QLTH.tbl_ThongTinNhaTruongDataTable tbl)
        {
            //MyDataSet.QLTH.tbl_ThongTinNhaTruongDataTable tbl = new QLTH.tbl_ThongTinNhaTruongDataTable();
            tbl_ThongTinNhaTruongTableAdapter adap = new tbl_ThongTinNhaTruongTableAdapter();
            adap.Connection.ConnectionString = getStrConn();

            adap.Fill(tbl);
            if (tbl.Rows.Count > 0)
            {
                for (int i = 0; i < tbl.Columns.Count; i++)
                    if (tbl.Columns[i] != tbl.idColumn && tbl.Columns[i] != tbl.logoColumn)
                    {
                        tbl[0][i] = CryptorEngine.Decrypt(tbl[0][i].ToString(), true);
                    }
            }

            //return tbl;
        }

        public static void fillSysTable(QLTH _qlth)
        {
            sys_GioiTinhTableAdapter adap = new sys_GioiTinhTableAdapter();
            adap.Connection.ConnectionString = getStrConn();
            adap.Fill(_qlth.sys_GioiTinh);


        }
    }
}
